package com.zpark.utils;

import com.zpark.exception.BusinessException;
import com.zpark.status.StatusCode;
import com.zpark.utils.ResultVO;
/**
 * 统一响应结果工具类
 * 提供快速构建ResultVO对象的方法
 */
public class ResultUtils {

    /**
     * 成功响应（无数据）
     * @return 只有状态码和消息的成功响应
     */
    public static <T> ResultVO<T> success() {
        return new ResultVO<>(StatusCode.SUCCESS.getCode(), StatusCode.SUCCESS.getMessage(), null);
    }

    /**
     * 成功响应（带数据）
     * @param data 返回的业务数据
     * @return 包含数据的成功响应
     */
    public static <T> ResultVO<T> success(T data) {
        return new ResultVO<>(StatusCode.SUCCESS.getCode(), StatusCode.SUCCESS.getMessage(), data);
    }

    /**
     * 成功响应（自定义消息）
     * @param message 自定义成功消息
     * @return 自定义消息的成功响应
     */
    public static <T> ResultVO<T> success(String message) {
        return new ResultVO<>(StatusCode.SUCCESS.getCode(), message, null);
    }

    /**
     * 成功响应（带数据和自定义消息）
     * @param message 自定义消息
     * @param data 返回的业务数据
     * @return 包含数据和自定义消息的成功响应
     */
    public static <T> ResultVO<T> success(String message, T data) {
        return new ResultVO<>(StatusCode.SUCCESS.getCode(), message, data);
    }

    /**
     * 错误响应（使用预定义状态码）
     * @param statusCode 状态码枚举
     * @return 标准错误响应
     */
    public static <T> ResultVO<T> error(StatusCode statusCode) {
        return new ResultVO<>(statusCode.getCode(), statusCode.getMessage(), null);
    }

    /**
     * 错误响应（自定义消息）
     * @param code 错误码
     * @param message 自定义错误消息
     * @return 自定义错误响应
     */
    public static <T> ResultVO<T> error(int code, String message) {
        return new ResultVO<>(code, message, null);
    }

    /**
     * 错误响应（带数据）
     * @param statusCode 状态码枚举
     * @param data 错误相关数据
     * @return 包含错误数据的响应
     */
    public static <T> ResultVO<T> error(StatusCode statusCode, T data) {
        return new ResultVO<>(statusCode.getCode(), statusCode.getMessage(), data);
    }

    /**
     * 业务异常响应
     * @param e 业务异常对象
     * @return 异常响应
     */
    public static <T> ResultVO<T> error(BusinessException e) {
        return new ResultVO<>(e.getCode(), e.getMessage(), null);
    }
}
